package com.woniuxy.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniuxy.entity.AllRun;
import com.woniuxy.mapper.AllRunMapper;
import com.woniuxy.service.IAllRunService;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author pml
 * @Date 2025/7/19 9:43
 * @Description TODO
 * 跑腿订单服务实现类
 * 命名规范：数据库表名(all_run)→ServiceImpl类名(AllRunServiceImpl)
 * 采用与OrderRunServiceImpl相同的实现方式，使用MyBatis-Plus条件构造器
 */
@Service
public class AllRunServiceImpl extends ServiceImpl<AllRunMapper, AllRun> implements IAllRunService {

    /**
     * 状态编码与名称映射表
     * 使用静态代码块初始化，避免重复创建对象
     * 与数据库表all_run的state字段定义保持一致
     */
    private static final Map<Integer, String> STATUS_MAP = new HashMap<Integer, String>() {{
        put(0, "待接单");
        put(1, "已接单");
        put(2, "已完成");
        put(3, "已结算");
        put(4, "已取消");
        put(5, "已过期");
    }};

    /**
     * 获取订单状态分布统计
     * 使用MyBatis-Plus的QueryWrapper实现分组统计查询
     * 无需XML文件，保持代码集中管理
     */
    @Override
    public List<Map<String, Object>> getOrderStatusDistribution() {
        // 创建查询条件构造器
        QueryWrapper<AllRun> queryWrapper = new QueryWrapper<>();

        // 指定查询字段：状态编码和数量统计
        // 使用COUNT(*) AS count统计每个状态的订单数量
        queryWrapper.select("state AS status, COUNT(*) AS count");

        // 按状态分组，确保每个状态单独统计
        queryWrapper.groupBy("state");

        // 按状态编码排序，保证结果顺序一致性
        queryWrapper.orderByAsc("state");

        // 执行查询，返回Map列表
        // 结果格式：[{status:0, count:10}, {status:1, count:20}, ...]
        List<Map<String, Object>> distribution = baseMapper.selectMaps(queryWrapper);

        // 补充状态名称，便于前端直接使用
        // 遍历结果，为每个状态添加中文名称
        for (Map<String, Object> item : distribution) {
            Integer status = (Integer) item.get("status");
            item.put("statusName", STATUS_MAP.getOrDefault(status, "未知状态"));
        }

        // 确保所有状态都有返回（即使数量为0）
        // 避免前端图表展示时缺少部分状态
        return completeAllStatus(distribution);
    }

    /**
     * 补全所有状态项（包括数量为0的状态）
     * 确保前端图表能展示完整的状态分布
     */
    private List<Map<String, Object>> completeAllStatus(List<Map<String, Object>> distribution) {
        // 将现有结果转为Map，便于快速查找
        Map<Integer, Map<String, Object>> statusMap = new HashMap<>();
        for (Map<String, Object> item : distribution) {
            Integer status = (Integer) item.get("status");
            statusMap.put(status, item);
        }

        // 补全缺失的状态
        List<Map<String, Object>> result = new ArrayList<>();
        for (Map.Entry<Integer, String> entry : STATUS_MAP.entrySet()) {
            Integer status = entry.getKey();
            String statusName = entry.getValue();

            if (statusMap.containsKey(status)) {
                // 已有统计数据，直接添加
                result.add(statusMap.get(status));
            } else {
                // 无统计数据，添加数量为0的项
                Map<String, Object> emptyItem = new HashMap<>();
                emptyItem.put("status", status);
                emptyItem.put("statusName", statusName);
                emptyItem.put("count", 0);
                result.add(emptyItem);
            }
        }

        return result;
    }
}